/**
 * 将文本复制到剪贴板
 * @description 支持现代浏览器的 Clipboard API 和传统的 execCommand 方法
 * @param {string} text - 要复制的文本内容
 * @param {Object} [options] - 配置选项
 * @param {boolean} [options.fallbackToExecCommand=true] - 当 Clipboard API 不可用时是否使用 execCommand
 * @returns {Promise<string>} 返回一个 Promise，复制成功返回复制的内容，失败时 reject
 * @example
 * // 基本使用
 * copyText('要复制的文本')
 *   .then(text => console.log('复制成功:', text))
 *   .catch(error => console.error('复制失败:', error));
 * 
 * // 使用 async/await
 * try {
 *   const text = await copyText('要复制的文本');
 *   console.log('复制成功:', text);
 * } catch (error) {
 *   console.error('复制失败:', error);
 * }
 */
export const copyText = async (
  text: string,
  options: {
    fallbackToExecCommand?: boolean;
  } = {}
): Promise<string> => {
  const { fallbackToExecCommand = true } = options;

  // 检查输入
  if (typeof text !== 'string') {
    throw new Error('复制的内容必须是字符串类型');
  }

  // 尝试使用 Clipboard API
  if (navigator.clipboard && window.isSecureContext) {
    try {
      await navigator.clipboard.writeText(text);
      return text;
    } catch (error) {
      if (!fallbackToExecCommand) {
        throw new Error(`复制失败: ${error instanceof Error ? error.message : String(error)}`);
      }
    }
  }

  // 使用 execCommand 作为备用方法
  if (fallbackToExecCommand) {
    try {
      const textarea = document.createElement('textarea');
      // 优化性能：最小化重排
      textarea.style.position = 'fixed';
      textarea.style.opacity = '0';
      textarea.style.pointerEvents = 'none';
      textarea.value = text;

      document.body.appendChild(textarea);

      // 处理 iOS 设备
      if (navigator.userAgent.match(/ipad|iphone/i)) {
        textarea.contentEditable = 'true';
        textarea.readOnly = false;
        
        const range = document.createRange();
        range.selectNodeContents(textarea);
        
        const selection = window.getSelection();
        if (selection) {
          selection.removeAllRanges();
          selection.addRange(range);
        }
        textarea.setSelectionRange(0, textarea.value.length);
      } else {
        textarea.select();
      }

      const successful = document.execCommand('copy');
      document.body.removeChild(textarea);

      if (successful) {
        return text;
      }
      
      throw new Error('复制操作失败');
    } catch (error) {
      throw new Error(`复制失败: ${error instanceof Error ? error.message : String(error)}`);
    }
  }

  throw new Error('当前环境不支持复制操作');
};
